Linux基础入门
Linux操作系统
主流操作系统
不同领域的主流操作系统,主要分为以下这么几类: 桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。接下来,这几个领域中,代表性的操作系统是那些?
1). 桌面操作系统
操作系统 | 特点 |
---|---|
Windows | 用户数量最多 |
MacOS | 操作体验好,办公人士首选 |
Linux | 用户数量少(桌面操作系统,Linux使用较少) |
2). 服务器操作系统
操作系统 | 特点 |
---|---|
Unix | 安全、稳定、付费 |
Linux | 安全、稳定、免费、占有率高 |
Windows Server | 付费、占有率低 |
3). 移动设备操作系统
操作系统 | 特点 |
---|---|
Android | 基于 Linux 、开源,主要用于智能手机、平板电脑和智能电视 |
IOS | 苹果公司开发、不开源,用于苹果公司的产品,例如:iPhone、 iPad |
4). 嵌入式操作系统
操作系统 | 特点 |
---|---|
Linux | 机顶盒、路由器、交换机 |
2.2 Linux系统版本
Linux系统的版本分为两种,分别是: 内核版 和 发行版。
1). 内核版
由Linus Torvalds及其团队开发、维护
免费、开源
负责控制硬件
2). 发行版
基于Linux内核版进行扩展
由各个Linux厂商开发、维护
有收费版本和免费版本
我们使用Linux操作系统,实际上选择的是Linux的发行版本。在linux系统中,有各种各样的发行版本,具体如下:
发行版本 | Logo | 特点 |
---|---|---|
Ubuntu | ![]() |
以桌面应用为主 |
RedHat | ![]() |
应用最广泛、收费 |
CentOS | ![]() |
RedHat的社区版、免费 |
openSUSE | ![]() |
对个人完全免费、图形界面华丽 |
Fedora | ![]() |
功能完备、快速更新、免费 |
红旗Linux | ![]() |
北京中科红旗软件技术有限公司开发 |
除了上述罗列出来的发行版,还有很多Linux发行版,这里,我们就不再一一列举了。
什么是操作系统
- 操作系统(Operating System)是应用程序运行的基础支撑环境
- 操作系统作用是管理和控制计算机系统的硬件与软件资源
- Intel x86架构上常见的操作系统:Windows、Linux、Unix…
Linux操作系统
- Linux是开源的基于Inter x86架构的类Unix多用户操作系统
- 支持多任务、多用户、多CPU
- 高效而灵活
- 兼容任意x86架构计算机
- 强大易用的系统命令
- 完整的应用软件生态
Linux发行版本
- Linux系统内核(kernel)提供了Linux操作系统的核心功能
- 不同开发商在内核基础上扩展封装,形成了不同发行版本
- 常见发行版:Red Hat Linux、CentOS、Ubuntu、SUSE…
Linux发行版选择建议
- 桌面系统:Ubuntu
- 服务器操作系统:**CentOS(免费)**、Red Hat Linux(收费)
- 特定需求:Debian(稳定性)、Fedoras(新特性)、麒麟Linux(国产)
CentOS - 社区企业操作系统
- 基于Red Hat Enterprice Linux的开源企业级Linux发行版本
- 各版本CentOS都会获得十年的支持,与RHEL保持同步更新
- CentOS采用社区支持,同步修正了RHEL许多BUG
CentOS版本选择
- CentOS 5/6:历史淘汰版本
- CentOS 7:主流版本,成熟稳定,大多数服务器的首先版本
- CentOS 8:全新版本,全新内核,存在漏洞隐患
安装CentOS 7.7
vmware.com/cn.html
VMware-workstation-full-14.1.2-8497320.exe
[链接: https://pan.baidu.com/s/1EbuhZ4D4kh_NcRJqTA-vhQ
密码:oq37]
mirrors.aliyun.com/centos/7.7.1908/isos/x86_64/ 下载 Everything-1908.iso
[centos-vault-centos-7.7.1908-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com)]
VM典型 镜像Iso 存储地址放在最快的硬盘 将虚拟磁盘存储为单个文件 自定义(内存2GB 处理器2核 虚拟化 Intel VT-x)
Linux目录结构
根目录/ 下各个目录的作用及含义说明:
编号 | 目录 | 含义 |
---|---|---|
1 | /bin | 存放二进制可执行文件 |
2 | /boot | 存放系统引导时使用的各种文件 |
3 | /dev | 存放设备文件 |
4 | /etc | 存放系统配置文件 |
5 | /home | 存放系统用户的文件 |
6 | /lib | 存放程序运行所需的共享库和内核模块 |
7 | /opt | 额外安装的可选应用程序包所放置的位置 |
8 | /root | 超级用户目录 |
9 | /sbin | 存放二进制可执行文件,只有root用户才能访问 |
10 | /tmp | 存放临时文件 |
11 | /usr | 存放系统应用程序 |
12 | /var | 存放运行时需要改变数据的文件,例如日志文件 |
Linux命令格式
命令 [参数选项] [文件或路径]
Linux文件操作核心命令
命令 | 用途 |
---|---|
cd | 切换目录 |
pwd | 查看当前目录 |
ls、ll(详细列表) | 显示目录内容 |
mkdir | 创建目录 |
cp | 复制文件与目录 |
mv | 移动或重命名文件 |
rm | 删除文件或目录 |
find | 查找目录或文件 |
按下Tab可以自动提示
输入su 密码root 进入root最高权限
cd .. 返回上级目录
cd ./local ./代表当前目录
cd local 到当前目录
mkdir ./imooc
mkdir -p ./imooc/sample/demo -p是连续创建多级目录
mkdir -p ./imooc1/sample1
mkdir -p -v./imooc1/sample1 -v是显示执行过程
mkdir -p -v./imooc1/sample1/demo1
=
mkdir -pv ./imooc1/sample1
cp Xftp-7.0.014lp.exe ./imooc/sample/demo 文件复制到指定目录
cp -r imooc/sample/demo imooc1/sample1/demo1 复制整个文件夹
cd imooc/sample/demo
mv Xftp-7.0.014lp.exe xftp.exe 重命名
ls
mv xftp.exe /imooc1/sample1/demo1 移动到其他目录
mv demo imooc1/sample1/demo1 移动文件夹到其他目录
cd game/share
rm -r music y y y 依次删除文件夹中的文件
rm -f music 强制直接删除, 不经过询问
rm -rf music 强制迭代删除 【不要轻易使用】
【ex】 rm -rf / imooc/sample/demo 中间不小心加了空格 就把/后面的整个都删除了
find / -name *.exe 按指定的格式去搜索文件
cd ..
[root@imooc home] find / -name *
vim文本编辑器
远程在线文本编辑器
- vi是linux重要的文字编辑工具,vim是增强版
- vim用于在远程环境下用命令形式对文本进行在线编辑
- 用法格式:vim [选项] [文件]
vim三种模式
- 普通模式:默认模式,文本只读,不可编辑
- 编辑模式:编辑文本模式,普通模式按i键进入,ESC键退出
- 命令模式:执行保存、搜索、退出等操作
vim重要快捷键
按i进入编辑模式
命令 | 用途 |
---|---|
delete或x | 删除单个字符 |
dd | 删除整行 |
/str | 全文查找str字符串,n下一个,N前一个 |
:% s/old/new/g | 替换文件内所有old字符串为new |
u | 撤销最近一次操作 |
:wq或者**:wq!** | 退出并保存,只读文件要格外加! |
:q! | 强制退出放弃保存 |
vim server.xml 修改文件
按i进入编辑模式
Home跳转行首
End跳转行尾
Esc退出编辑模式
命令只允许在普通模式下运行
/8080 查找端口(高亮显示)
查找到后按n是查找下一个 按N是查找上一个
u 撤销最近一次操作
:% s/8080/8900/g 进行端口的全局替换
:% s/"80"/8900/g 想要把80改成8900 且不影响其他数值[把引号也加入其中]
Linux文本工具
常用文本工具
命令 | 用途 |
---|---|
echo | 屏幕打印与文本输出 后面要加引号”hello” |
cat | 合并文件或查看文件内容 |
tail | 显示文件内容尾部 |
grep | 文本过滤工具 |
echo "hello" > hello.txt 将左侧命令的结果重写到右侧文件
vim hello.txt
:q 退出
echo "hello" >> hello.txt 内容的追加
cat hello.txt 直接打印到控制台
cat -n hello.txt -n是在每一行前加行号
cat -nE hello.txt 结尾的时候显示结束符$
echo "hello" > hello.txt
cat hello.txt => hello
echo "my name is lili" > myname.txt
cat hello.txt myname.txt >> full.txt 合并文件内容为新的文件
vim full.txt
echo 和 cat 在实际开发中 打印日志 最后用cat拼接日志
cat > test.txt << EOF 在当前的输入环境中产生输入流 输入的全输入到test.txt 输入流结束字符串是EOF
> Welcome to imooc.com
> I like linux
> bye!
> EOF
tail处理日志很方便 bug日志
tail full.txt => hello my name is lili
tail -n 1 full.txt => my name is lili "1"代表显示文本最后一行
tail -f full.txt 对文件进行监听 一旦产生变化就输出控制台【适合用在服务器】
ctrl + c 退出
#cat test.txt
=> welcome to imooc.com
=> I like linux
=> bye!
#grep l test.txt
we"l"come to imooc.com
I "l"ike "l"inux
#grep l test.txt > out.txt 符合条件的可以输出到out.txt文件中
#grep -v l test.txt -v 挑选出不包含l的test.txt文件
#grep i...c test.txt "."代表匹配任意字符
#ll | grep .txt 通道特殊使用方法:筛选出后缀是.txt的
前面ll命令输出的结果会作为后面gerp命令的依据 通过|进行分割
#ll | grep -E "log[0-9]{1,5}.txt" 通道特殊使用方法:扩展正则表达式
-rw-r--r--. 1 root root 3 12月 23 13:10 log1.txt
-rw-r--r--. 1 root root 3 12月 23 13:10 log2.txt
-rw-r--r--. 1 root root 3 12月 23 13:10 log3.txt
文件打包[文件组织]与压缩[磁盘节省]
Linux压缩程序-gzip
- gzip是Linux系统的文件压缩程序
- gzip压缩包文件扩展名 .gz
- 大流量的网站默认都在使用 gzip 进行数据压缩传输
tar打包与压缩
- tar是linux系统将多个文件打包和压缩的工具
- tar本质的打包软件,扩展名是 **.tar **
- tar可结合gzip或其他压缩工具实现打包压缩,扩展名 .tar.gz
- 压缩命令:
tar zcvf tomcat.tar.gz game/src
- 解压缩命令:
tar zxvf tomcat.tar.gz -C game/src
tar常用可选项
选项 | 用途 |
---|---|
z | 通过gzip压缩或解压 |
c | 创建新的tar.gz文件 |
v | 显示执行过程 |
f | 指定压缩文件名称 |
x | 解压缩tar.gz文件 |
-C | 指定解压缩目录 |
安装与卸载应用程序
为CentOS安装应用程序
- 在CentOS中安装第三方应用程序包含两种方式:
- rpm: Red Hat 软件包管理器, 相当于应用程序安装文件的执行者
- 编译安装:用户自己从网站下载程序源码进行编译安装
yum与rpm的关系
- rpm安装过程中, 需要用户自己解决依赖问题
- yum通过引入软件仓库,联网下载rpm包及依赖,并依次自动安装
- yum是rpm的前端程序,其目的就是简化rpm的安装过程
yum常用命令
- yum search 应用名 #在仓库中查询是否存在指定应用
- yum instal -y 应用名 #全自动下载安装应用及依赖
- yum info 应用名 #查看应用详细信息
- yum list installed 应用名 #查看已安装的应用程序
- rpm -ql 应用名 #查看安装后输出的文件清单
- yum remove -y 应用名 #全自动卸载指定应用
① 利用yum安装tree
yum search tree
yum install tree.x86_64 安装tree
yum install -y tree.x86_64 遇到所有的默认y进行安装
tree -d 或 tree 查看文件树型结构
which tree 查看刚刚tree安装的目录
rpm -ql tree.x86_64 查看刚刚tree安装了哪些文件
yum list installed 查看已经安装的应用
yum list installed *tree* 查看已安装的应用其中有tree的
yum remove tree.x86_64 卸载程序
② 利用编译方式安装应用程序
- 如yum仓库未提供rpm,往往需要采用编译安装方式
- 编译安装是指从应用网站下载源码后,对源码进行编译后使用
- 编译命令:**make #**使用对应编译器对源码编译生成可执行文件
yum与编译安装的比较
yum安装 | 编译安装 | |
---|---|---|
兼容性 | 差,每种发行版都要准备 | 好,全平台适用 |
复杂度 | 简单 | 复杂 |
安装速度 | 快 | 慢 |
来源 | 应用仓库 | 官网下载 |
应用场景 | 日常系统软件 | 开源软件,最新版本 |
编译安装Redis[非关系型数据库]
# make
# yum install -y gcc
# cd ..
# clear
# rm -rf ./redis-4.0.14
# tar zxvf redis-4.0.14.tar,gz
# cd redis-4.0.14/
# clear
# make
[root@imooc redis-4.0.14]# ./src/redis-server redis.conf
Linux系统管理命令
使用 ifconfig
查看网卡ip
netstat
查看网络端口号
netstat -tulpn 或者 netstat -ano
netstat 常用选项
选项 用途 t 显示tcp传输协议的连接状况 u 显示udp传输协议的连接状况 l 显示处于监听状态的网络连接 p 显示应用PID和程序名称 n 显示ip地址 a 显示所有连接 o 显示计时器
查看进程 & 杀掉进程
- ps -ef
# ps -ef | grep vim
‘|’代表通道 - **kill -9 PID ** 专门按照pid杀死指定进程(强制删除)
#ps -ef | grep redis
#netstart -tulpn | grep 6379
应用服务化
- 应用服务化是指让应用程序以服务方式在系统后台运行
- Linux系统对服务化应用进行统一管理
- 服务管理命令:systemctl
指令 | 用途 |
---|---|
start | 启动服务 |
stop | 停止服务 |
restart | 重启服务 |
enable | 设置开机启动 |
disable | 禁止开机启动 |
status | 查看服务状态 |
daemon-reload | 重载服务配置文件 |
list-unit-files | 列出所有服务 |
启动redis
./src/redis-server redis.conf 进入到redis安装目录下执行
ctrl + z
#ps -ef | grep redis
#find / -name *.pid
cd.. cd.. cd..
cd usr/lib/systemd/system
#pwd
=>/usr/lib/systemd/system
#vim redis.service 按i进入编写模式
=>
<==========================================================================>
[Unit]
Description=Redis
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking #描述服务类型:后台运行
PIDFile=/run/redis_6379.pid #指向刚刚继承编号的pid
ExecStart=/usr/local/redis-4.0.14/src/redis-server /usr/local/redis-4.0.14/redis.conf #服务启动时使用什么命令 调用redis-server
ExecStop=/bin/kill -s QUIT $MAINPID
#对指定的命令关闭 $后自动带入pidfile -s quit是按正常流程关闭
PrivateTmp=true
[Install]
WantedBy=multi-user.target #将radis分配到multi-user.target服务组上[随系统自动启动]
<==========================================================================>
[root@imooc system]#systemctl daemon-reload 对所有redis进行重载
[root@imooc system]#ps -ef | grep redis
[root@imooc system]#kill -s QUIT #杀死所有redis进程测试能否实现自启动
[root@imooc system]#systemctl start redis
[root@imooc system]#systemctl status redis
https://www.cnblogs.com/niway/p/15346572.html
[root@imooc system]#systemctl stop redis #停止服务
[root@imooc system]#systemctl enable redis #随着系统启动
[root@imooc system]#systemctl list-unit-files #查看系统中每一个服务命令
[root@imooc system]#systemctl list-unit-files | grep enabled #查看自启动的命令
[root@imooc system]#shutdown -r now #断开连接
Linux用户与权限
用户
- Linux是多用户多任务系统,包含两个概念:用户与用户组
- 用户与账户是同一概念,用于登录系统与区分资源权限
- 用户让系统变的更安全,同时也保护了用户的个人数字资产
用户组
- 用户组就是将用户分组,隶属用户自动拥有组权限
- 一个用户可隶属于多个组,用户可任意切换当前组
- 用户组的出现让用户权限管理变更轻松
用户与用户组的常用命令
命令 | 用途 |
---|---|
useradd | 创建新用户 |
passwd | 修改密码 |
usermod | 修改用户信息/分配组 (覆盖原组) |
groupadd | 创建新的用户组 |
chown | 更改文件的属主或属组 |
chmod | 更改文件的访问权限 |
newgrp | 切换用户当前组 |
项目内部文件权限管理实践
3员工(2个程序员 1个测试员)
[root@imooc imooc]# adduser d1
[root@imooc imooc]# adduser d2
[root@imooc imooc]# adduser t1
[root@imooc imooc]# passwd d1 => shuangyu1
[root@imooc imooc]# passwd d2 => shuangyu2
[root@imooc imooc]# passwd t1 => shuangyu3
[root@imooc imooc]# groupadd developer
[root@imooc imooc]# groupadd testor
[root@imooc imooc]# usermod -g developer d1
[root@imooc imooc]# usermod -g developer d2
[root@imooc imooc]# usermod -g testor t1
在上方点击打开 并且复制3个Centos7 分别改用户名(d1 d2 t1)和密码(shuangyu1/2/3)
[root@imooc imooc]# cd
[root@imooc ~]# cd /usr/local/share
[root@imooc share]# mkdir dev-document
[root@imooc share]# ll
drwxr-xr-x. 2 root root 28 11月 15 18:37 applications
drwxr-xr-x. 2 root root 6 12月 3 20:36 dev-document
drwxr-xr-x. 2 root root 6 4月 11 2018 info
drwxr-xr-x. 21 root root 243 11月 15 18:25 man
【前方的drwxr-xr-x 含义见图】
[root@imooc share]# chown d1:developer dev-document 更改对应目录文件的属主(由超级管理员交給研发组) d1可以对developer拥有完整的操作权限 developer以外的用户有读取执行权 其他用户 只有执行权
drwxr-xr-x. 2 root root 28 11月 15 18:37 applications
drwxr-xr-x. 2 d1 developer 6 12月 3 20:36 dev-document
drwxr-xr-x. 2 root root 6 4月 11 2018 info
drwxr-xr-x. 21 root root 243 11月 15 18:25 man
[root@imooc share]# chmod 750 dev-document/ 其他用户不允许任何权限
[root@imooc share]# ll
总用量 0
drwxr-xr-x. 2 root root 28 11月 15 18:37 applications
drwxr-x---. 2 d1 developer 6 12月 3 20:36 dev-document
drwxr-xr-x. 2 root root 6 4月 11 2018 info
drwxr-xr-x. 21 root root 243 11月 15 18:25 man
返回到Centos 7 - t1
[t1@imooc ~]$ cd /usr/local/share/dev-document/
-bash: cd: /usr/local/share/dev-document/: 权限不够
返回到Centos 7 - d2
[d2@imooc ~]$ cd /usr/local/share
[d2@imooc share]$ mv dev-document/ doc
mv: 无法将"dev-document/" 移动至"doc": 权限不够
上方的chmod 750 的意思是 对应下方的表 第一个7是第一个rwx相加之和4+2+1
====================chmod命令====================
★ chmod 750:组用户可读写,其他用户不允许访问 ★
★ chmod 777:所有用户拥有完整权限 ★
★ chmod 700:只有属主拥有完整权限 ★
====================++++++++====================
d1弄个文档整个公司的所有人都可以使用
[d1@imooc ~]$ cd /usr/local/share/dev-document/
[d1@imooc dev-document]$ vim code.md
[d1@imooc dev-document]$ ll
-rw-r--r--. 1 d1 developer 13 12月 3 20:59 code.md
第一个是d则是文件夹 -则是文件 属主可以对文件读写。组仅仅可以读取。其他人仅仅可以读取
[d1@imooc dev-document]$ chmod 770 code.md
[d1@imooc dev-document]$ ll
总用量 4
-rwxrwx---. 1 d1 developer 13 12月 3 20:59 code.md
d2即可读写
[d2@imooc dev-document]$ vim code.md
如何让d1同时拥有两个组
[root@imooc share]# usermod -G developer,testor d1
[root@imooc share]# groups d1
d1: developer testor
将当前组切换到新的用户组上
[d1@imooc ~]$ newgrp testor
[d1@imooc ~]$ groups
d1:testor developer
sudo获取超级管理员权限
- sudo可以让普通用户拥有超级管理员的执行权限
- 普通用户要经过超级管理员授权才能使用
- 授权命令:visudo
在root端输入 visudo 并且输入100gg 快速定位到100行
[root@imooc ~]#visudo
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
d1 ALL=(ALL) ALL #按i进入编辑模式且增加此行
↑:ALL任意电脑可以连接 后ALL可以切换其他用户执行命令 后后ALL允许哪些命令
ESC退出模式后输入
[root@imooc imooc]# visudo -c
/etc/sudoers:解析正确
[d1@imooc ~]$ useradd d3 #目前还没有权限
useradd: Permission denied.
useradd:无法锁定 /etc/passwd,请稍后再试。
[d1@imooc ~]$ sudo useradd d3 #以d1的身份給d3一个超级管理员的权限
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] d1 的密码:=》 shuangyu1
[d1@imooc ~]$ sudo passwd d3
更改用户 d3 的密码 =》 shuangyu33
回到主Centos 7
[root@imooc ~]#visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
d1 ALL=(ALL) NOPASSWD:ALL
NOPASSWD:ALL意味着做任何命令之前不用输入密码
[d1@imooc ~]$ sudo useradd d4
[d1@imooc ~]$ #直接不需要输入密码了
CentOS7防火墙firewall
防火墙
- 防火墙是借助硬件和软件对内外部网络环境的保护措施
- CentOS 7基于firewall实现应用层防火墙,CentOS6基于iptables
- firewall-cmd是firewall的核心命令
对外开放Tomcat
把apache-tomcat.tar.gz放入/usr/local中
[root@imooc local]# tar zxvf apache-tomcat-9.0.34.tar.gz
[root@imooc local]# ll
[root@imooc local]# cd apache-tomcat-9.0.34/
[root@imooc apache-tomcat-9.0.34]# cd bin
[root@imooc bin]# ./startup.sh
[root@imooc bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-9.0.34
Using CATALINA_HOME: /usr/local/apache-tomcat-9.0.34
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-9.0.34/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/apache-tomcat-9.0.34/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.34/bin/tomcat-juli.jar
Tomcat started.
[root@imooc bin]# netstat -tulpn|grep 8080 #查看端口是否开启
tcp6 0 0 :::8080 :::* LISTEN 4302/java
在虚拟机内部去fox浏览器搜索 localhost:8080 就会看到可爱的绿色小猫咪
若想在计算机中访问端口 192.168.170.129:8080 则需要关闭虚拟机的防火墙
[root@imooc bin]# firewall-cmd --state #查看防火墙状态
running
[root@imooc bin]# firewall-cmd --list-ports #查看防火墙放行的端口(空代表无任何放行端口)
[root@imooc bin]# firewall-cmd --zone=public --permanent --add-port=8080/tcp
#### zone防火墙定义的规则区域、产生永久变更、增加端口8080、tcp形式
[root@imooc bin]# firewall-cmd --reload #进行配置重载
若不需要开放8080端口则需要
[root@imooc bin]# firewall-cmd --zone=public --permanent --remove-port=8080/tcp
[root@imooc bin]# firewall-cmd --reload #进行配置重载
[root@imooc bin]# firewall-cmd --zone=public --permanent --add-port=8000-9000/tcp
###放行区域端口
[root@imooc bin]# firewall-cmd --reload #进行配置重载
Bash Shell
- Shell是一个用c语言编写的脚本解释器,是用户通过代码操作Linux的桥梁
- Shell脚本描述要执行的任务,完成系列复杂操作,文件通常以**.sh**后缀
- Shell脚本通过Shell解释器执行,按解释器分类分为多种类型
Linux Shell分类
Shell种类 | Shell解释器 |
---|---|
Bourne Shell | /usr/bin/sh 或 /bin/sh |
Boourne Again Shell | /bin/bash(默认) |
C Shell | /usr/bin/csh |
K Shell | /usr/bin/ksh |
Shell for Root | /sbin/sh |
一键发布Tomcat应用程序
编写shall脚本
[root@imooc local]# vim deploy_tomcat.sh
======================================================================
echo "准备下载Tomcat9"
wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
echo "正在解压缩Tomcat9"
tar zxf apache-tomcat-9.0.34.tar,gz
echo "防火墙开放8080端口"
firewall-cmd --zone=public --permanent --add-port=8080/tcp
firewall-cmd --reload
echo "启动Tomcat"
cd ./apache-tomcat-9.0.34/bin
./startup.sh
======================================================================
[root@imooc local]# ./deploy_tomcat.sh 开启文件
综合训练:Linux部署慕课网办公OA
部署架构:Chrome + Tomcat Web服务器 + MySQL服务器 【中间通过网络通信】
重新安装CentOS 7-DB【最小值安装】
[root@localhost ~]# yum install -y net-tools
CentOS 7-DB ifconfig ==》 192.168.170.131 账户:centos-db 密码:panchunyao123
CentOS 7-WEB ifconfig ==》 192.168.170.133 账户:centos-web 密码:panchunyao123
DB按照MySQL
WEB按照Tomcat
CentOS安装MySQL 8
查找有没有mysql安装包
[centos-db@localhost ~]$ yum search mysql-community
去官网找到Linux版的 右键复制链接地址
[root@localhost ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
bash: wget: command not found
卧槽 wegt不存在,那就按装wget
[root@localhost ~]# yum install -y wget
[root@localhost mysql]# ll
total 16
-rw-r--r--. 1 root root 14064 Oct 24 07:44 mysql80-community-release-el7-11.noarch.rpm
[root@localhost mysql]# yum localinstall -y mysql80-community-release-el7- 11.noarch.rpm #自动安装mysql源
[root@localhost mysql]# yum search mysql-comm #此时查找一下就会出现大量mysql组件
[root@localhost mysql]# yum install -y mysql-community-server #安装mysql{在欧美很慢}
ctrl+c 停止安装
[root@localhost mysql]# cd /var/cache/yum/x86_64/7/mysql80-community/packages/
#yum下载的缓存路径 在网上下载好后Linux版的MySQL后 进入
[root@localhost mysql80-community] /var/cache/yum/x86_64/7/mysql80-community
用命令更改文件夹权限:chmod 777 test01(需要赋予权限的文件夹)
之后将解压缩的MySQL拖进去
注意:如果直接下载 yum localinstall mysql80-community-release-el7- 11.noarch.rpm 的话会有很多依赖不会被自动下载,最保准的就是去网上下载Linux版本的MySQL再利用Xftp拖进去
[root@localhost package]# yum install -y mysql-community-server 【最快最省事 自动下载&安装依赖】
[root@localhost package]# systemctl start mysqld
[root@localhost package]# netstat -tulpn
tcp6 0 0 :::3306 :::* LISTEM 21850/mysqld
[root@localhost package]# systemctl status mysqld #查看myql启动状态
[root@localhost package]# systemctl enable mysqld #设置开机自启动
初始化MySQL[CentOS 7-DB]
查看mysql日志寻找mysql密码
[root@localhost package]# vi /var/log/mysqld.log
root@localhost: Y,#)foTQ,7js
[root@localhost package]# mysql -uroot -p
修改密码!
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'Panchunyao123!'
mysql> use mysql
mysql> select host,user from user;
mysql> update user set host='%' where user='root'; #任意设备都可使用%连接到mysql服务器
host: % user: root
mysql> flush privileges; #使修改的权限数据生效
mysql> exit
下一步是放行防火墙3306端口
[root@localhost package]# firewall-cmd --zone=public --permanent --add-port=3306/tcp
[root@localhost package]# firewall-cmd --reload
去电脑端的Navicat Premium 连接新数据库
MySQL-新建连接
连接名:centos-db
主机:192.168.170.131
端口:3306
用户名:root
密码:Panchunyao123!
新建数据库 imooc-oa utf8mb4 执行sql文件 imooc-oa.sql
部署配置Web应用服务器
CentOS 7-DB ifconfig ==》 192.168.170.131 账户:centos-db 密码:panchunyao123
CentOS 7-WEB ifconfig ==》 192.168.170.133 账户:centos-web 密码:panchunyao123
[root@localhost ~]# yum search jdk #查看仓库中包含哪些jdk
[root@localhost ~]# yum install -y java-1.8.0-openjdk #安装jdk以及所有依赖
[root@localhost ~]# java -version
[root@localhost ~]# which java #查看安装到哪个地方
/bin/java
安装tomcat
[root@localhost ~]# cd /usr
用命令更改文件夹权限:chmod 777 local
[root@localhost usr]# cd local
打开Xftp将apache-tomcat-9.0.34.tar.gz 传入到local内
[root@localhost local]# tar zxf apache-tomcat-9.0.34.tar.gz #对压缩包进行解压
将素材资料里的imooc_oa.war拖入Xftp的local中 之后进行解压
[root@localhost local]# tar zxf imooc_oa.war
需要将imooc_oa复制到tomcat9的webapps下才可生效
[root@localhost local]# mv imooc_oa ./apache-tomcat-9.0.34/webapps/
[root@localhost local]# cd apache-tomcat-9.0.34/webapps/
[root@localhost webapps]# vim ./imooc_oa/WEB-INF/classes/mybatis-config.xml
#远程对服务器配置连接数据库服务器
-bash: vim: 未找到命令 需要先安装vim
[root@localhost webapps]# yum install -y vim-common
[root@localhost webapps]# yum install -y vim-enhanced #再安装一个增强的vim包
[root@localhost webapps]# vim ./imooc_oa/WEB-INF/classes/mybatis-config.xml
输入/root 进行全文查找 修改<property 中的value="jdbc:mysql:..." loacalhost改为自己网络ip:192.168.170.131
再修改一下下面的password: Panchunyao123!
:wq
[root@localhost webapps]# cd ..
[root@localhost apache-tomcat-9.0.34]# vim ./conf/server.xml
/8080 搜索 <Connector port="80" 只保留80端口
/Host> 找到最下面 在上面一行加入
<Context path="/" docaBacs="imooc_oa"/> #将imooc_oa目录映射到根路径"/"
:wq
之后启动tomcat
[root@localhost apache-tomcat-9.0.34]# ./bin/startup.sh
[root@localhost apache-tomcat-9.0.34]# netstat -tulpn #查看进程
tcp6 0 0 :::80 :::* LISTEN 20303/java
用防火墙将80端口对外进行暴露
[root@localhost apache-tomcat-9.0.34]# firewall-cmd --zone=public --permanent --add-port=80/tcp
[root@localhost apache-tomcat-9.0.34]# firewall-cmd --reload #重载
回到电脑浏览器输入:http://192.168.170.133/login.html
数据库安全【根据3306端口可以查到数据库根源】:对指定IP端口进行放行
[root@localhost ~]# firewall-cmd --zone=public --permanent --remove-port=3306/tcp
[root@localhost ~]# firewall-cmd --reload #重载
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.170.133" port protocol="tcp" port="3306" accept " #-rich-rule防火墙内部规则强大的定义表达式
[root@localhost ~]# firewall-cmd --reload #重载
[root@localhost apache-tomcat-9.0.34]# ./bin/shutdown.sh
[root@localhost apache-tomcat-9.0.34]# ./bin/startup.sh
Redis (内存[非常快]数据库、非关系型数据库)
- Redis是Key-Value型NoSQL数据库
- Redis将数据存储在内存(RAM)中,同时也能持久化到磁盘
- Redis常用于缓存,利用内存的高效提高程序的处理速度
Redis特点
- 速度快
- 广泛的语言支持
- 持久化
- 多种数据结构
- 主从复制(多台Redis可以保持数据同步)
- 分布式与高可用(7×24小时服务 淘宝/京东) 全国各地多个主机 降低网络传输时间
Redis的安装与启动
- 在Linux系统中安装redis (http://redis.io/download)
$ wegt http://download.redis.io/releases/redis-5.0.2.tar.gz
$ tar xzf redis-5.0.2.tar.gz
$ cd redis-5.0.2
$ make
[root@imooc imooc]# cd /usr/local
[root@imooc local]# ll
[root@imooc local]# mkdir redis
[root@imooc local]# ll
[root@imooc local]# cd redic
[root@imooc redic]# yum install gcc
[root@imooc redic]# wegt http://download.redis.io/releases/redis-5.0.2.tar.gz
[root@imooc redis]# tar xzf redis-5.0.2.tar.gz
[root@imooc redis]# cd redis-5.0.2
[root@imooc redis-5.0.2]# make
Hint: It's a good idea to run 'make test' ;) 安装成功
[root@imooc redis-5.0.2]# ll #找redis.conf
总用量 240
-rw-rw-r--. 1 root root 85327 11月 22 2018 00-RELEASENOTES
-rw-rw-r--. 1 root root 53 11月 22 2018 BUGS
-rw-rw-r--. 1 root root 1894 11月 22 2018 CONTRIBUTING
-rw-rw-r--. 1 root root 1487 11月 22 2018 COPYING
drwxrwxr-x. 6 root root 192 12月 5 11:47 deps
-rw-rw-r--. 1 root root 11 11月 22 2018 INSTALL
-rw-rw-r--. 1 root root 151 11月 22 2018 Makefile
-rw-rw-r--. 1 root root 4223 11月 22 2018 MANIFESTO
-rw-rw-r--. 1 root root 20555 11月 22 2018 README.md
-rw-rw-r--. 1 root root 62155 11月 22 2018 redis.conf
-rwxrwxr-x. 1 root root 275 11月 22 2018 runtest
-rwxrwxr-x. 1 root root 280 11月 22 2018 runtest-cluster
-rwxrwxr-x. 1 root root 281 11月 22 2018 runtest-sentinel
-rw-rw-r--. 1 root root 9710 11月 22 2018 sentinel.conf
drwxrwxr-x. 3 root root 8192 12月 5 11:49 src
drwxrwxr-x. 10 root root 167 11月 22 2018 tests
drwxrwxr-x. 8 root root 4096 11月 22 2018 utils
[root@imooc redis-5.0.2]# cd src
[root@imooc src]# ll #找redis- server启动目录
[root@imooc src]#cd ..
[root@imooc redis-5.0.2]# ./src/redis-server redis.conf
若端口被占用
找到redis-server的进程,然后杀死对应的进程,然后重新启动redis
>>> ps -ef | grep -i redis
root 3585 19590 0 10:36 pts/20 00:00:00 redis-server *:6379
user 3684 3663 0 10:38 pts/21 00:00:00 grep --color=auto -i redis
进程3585是redis的服务,
kill -9 3585
- 在Windows系统安装Redis
https://github.com/microsoftarchive/redis/releases 下载后解压
打开cmd
C:\Users\Pluminary>d:
D:\>cd Redis-x64-3.0.504
D:\Redis-x64-3.0.504>dir
D:\Redis-x64-3.0.504>redis-server redis.windows.conf
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.504 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 22828
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
Redis的常用基本配置
配置项 | 示例 | 说明 |
---|---|---|
daemonize | daemonize yes | 是否启用后台运行, 默认no |
port | port 6379 | 设置端口号, 默认6379 |
logfile | logfile 日志文件 | 设置日志文件 |
databases | databases 255 | 设置redis数据库总量 |
dir | dir 数据文件目录 | 设置数据文件存储目录 |
requirepass | requirepass 12345 | 设置使用密码 |
守护进程方式启动Redis
[root@imooc ~]# cd /usr/local/redis/redis-5.0.2/
[root@imooc redis-5.0.2]# vim redis.conf #打开后台启动
136行 daemonize no 改成 daemonize yes
[root@imooc redis-5.0.2]# ./src/redis-server redis.conf
关闭终端打开全新终端
[root@imooc ~]# netstat -tulpn
tcp 0 0 127.0.0.1:6379 ... 6338/./src/redis-se
如果关闭
kill -9 6338
redis使用
[root@imooc redis-5.0.2]# ./src/redis-cli #执行redis内置指令
127.0.0.1:6379> ping #启动成功
PONG
127.0.0.1:6379> exit #退出
[root@imooc redis-5.0.2]# ./src/redis-cli shutdown #更加安全的关闭redis
报错(添加log文件 将redis命令行的结果打印到log中)
https://blog.csdn.net/qq_46127735/article/details/113933690
为了保护安全将port从6379改为6380
[root@imooc redis-5.0.2]# vim redis.conf
/port 寻找92行
port 6380
[root@imooc redis-5.0.2]# ./src/redis-cli -p 6380
127.0.0.1:6380> select 0 #当前使用第几号数据库
127.0.0.1:6380> select 15
[root@imooc redis-5.0.2]# vim redis.conf
在186行 可以改变数据连接数量
databases 15→255
[root@imooc redis-5.0.2]# vim redis.conf
507行注释去掉 此行是输入密码
requirepass panchunyao123
再次登录就
127.0.0.1:6380> auth panchunyao123
redis中有一个dump.rdb 全量备份 同时备份到磁盘中
Redis通用命令
命令 | 示例 | 说明 |
---|---|---|
select | select 0 | 选择0号数据库 |
set | set name lily | 设置key=name, value=lily |
get | get hello | 获得key=hello结果 |
keys | keys he* | 根据Pattern表达查询符合条件的key |
dbsize | dbsize | 返回key的总数 |
exists | exists a | 检查key=a是否存在 |
del | del a | 删除key=a的数据 |
expire | expire hello 20 | 设置key=hello 20秒后过期 |
ttl | ttl hello | 查看key=a的过期剩余时间 |
[root@imooc redis-5.0.2]# ./src/redids-cli -p 6380 #重新连接到端口
127.0.0.1:6380> select 10
127.0.0.1:6380[10]> set name lily #十号数据库中增加key=name value=lily
127.0.0.1:6380[10]> get name => "lily"
127.0.0.1:6380[10]> select 9
127.0.0.1:6380[9]> get name =>(nil)
127.0.0.1:6380[9]> set name kitty
127.0.0.1:6380[9]> get name =>"kitty"
127.0.0.1:6380[9]> keys * #列举表达式能匹配的所有key
127.0.0.1:6380[9]> set sex male
127.0.0.1:6380[9]> keys *
127.0.0.1:6380[9]> keys n* #模糊匹配表达式
127.0.0.1:6380[9]> dbsize #显示当前数据库的总量 => 2个 => "name" "sex"
127.0.0.1:6380[9]> del sex #删除 => 1 返回0则不存在
127.0.0.1:6380[9]> expire name 30 #生效开始之后30秒存活时间
127.0.0.1:6380[9]> ttl name #查看存活时间 时间一到自动清除 keys*中无name数据
Redis数据类型
键 | 值 |
---|---|
name | Lily |
counter | 3321 |
sn | 7361-7749 |
字符串命令
命令 | 示例 | 说明 |
---|---|---|
get | get hello | 获取key=hello结果 |
set | set hello world | 设置key=hello, value=hello |
mset mget | mset hello world java best mget hello java |
一次性设置或者获取多个值 |
del | del hello | 删除key=hello |
incr/decr | incr count decr count |
key值自增/自减1 |
incrby/decrby | incrby count 99 decrby count 99 |
自增自减指定步长 |
127.0.0.1:6380[9]> select 10
127.0.0.1:6380[10]> set name lily
127.0.0.1:6380[10]> set sex 18
127.0.0.1:6380[10]> set birthday 1998-03-11
127.0.0.1:6380[10]> keys *
1) "birthday" 2)"name" 3)"sex"
127.0.0.1:6380[10]> mset name1 kitty sex1 20 birthday1 2001-03-02 #一次性设置多个键值对
127.0.0.1:6380[10]> mget name sex birthday #一次性提取多个
127.0.0.1:6380[10]> clear #当前屏幕清空
127.0.0.1:6380[10]> incr age #将指定的数字自增+1
127.0.0.1:6380[10]> set age 20
127.0.0.1:6380[10]> keys age => "age"
127.0.0.1:6380[10]> get age => "20"
127.0.0.1:6380[10]> incr age => (integer) 22 #不可以自增字符串噢
127.0.0.1:6380[10]> decrby age 3 #对指定的key自减 => 20-3=17
127.0.0.1:6380[10]> del age #删除某个key
Hash类型用于存储结构化数据
↓↓↓ ↓↓↓ key = emp:1 ↓↓↓ ↓↓↓ 在value中又产生一个键值对[下面全是单个的emp:1的key值]
name | smith |
---|---|
age | 35 |
birthday | 2001-02-02 |
height | 178 |
命令 | 示例 | 说明 |
---|---|---|
hget | hget emp:1 age | 获取hash中key=age的值 |
hset | hset emp:1 age 23 | 设置hash中age=23 |
hmset hmget hgetall |
hmset emp:1 age 30 name kaka hmget emp:1 age name hgetall emp:1 |
设置hash多个值 获取hash多个值 获取hash所有值 |
hdel | hdel emp:1 age | 删除emp:1的age |
hexists | hexists emp:1 name | 检查是否存在 |
hlen | hlen emp:1 | 获取指定长度 |
127.0.0.1:6380[1]> hset emp:1 name zhangsan #设置某个hash值
127.0.0.1:6380[1]> hset emp:1 age 35
127.0.0.1:6380[1]> hset emp:1 birthday 2001-02-02
127.0.0.1:6380[1]> hset emp:1 height 178
127.0.0.1:6380[1]> keys * => "emp:1"
127.0.0.1:6380[1]> hget emp:1 name #获取指定hash值 =>"zhangsan"
127.0.0.1:6380[1]> hget emp:1 age => "35"
127.0.0.1:6380[1]> hgetall emp:1 #提取所有的数据
127.0.0.1:6380[1]> hmset emp:2 name lisa age 23 birthday 1990-05-03 height 165
127.0.0.1:6380[1]> hgetall emp:2
127.0.0.1:6380[1]> del emp:2 #删除整个对象
127.0.0.1:6380[1]> hlen emp:1 => (integer) 4 #代表在emp:1中有4个属性
127.0.0.1:6380[1]> hgetall emp:1
127.0.0.1:6380[1]> hexists emp:1 name #判断属性是否存在 是则返回1
List - 列表类型
- List列表就是一系列字符串的”数组”, 按插入顺序排序
- List列表最大长度为2的32次方-1, 可以包含40亿个元素
List命令
- rpush listkey c b a - 右侧插入 先c后b最后a
- lpush listkey f e d - 左侧插入 先f后e最后d d e f c b a
- rpop listkey - 右侧弹出 d e f c b
- lpop listkey -左侧弹出 e f c b
127.0.0.1:6380[1]> rpush list c =>(integer) 1
127.0.0.1:6380[1]> lrange list 0 -1 #输出指定列表起始到结束范围内的所有元素 [开始 末尾]
127.0.0.1:6380[1]> rpush list b a =>(integer) 3
127.0.0.1:6380[1]> lrange list 0 -1 => "c" "b" "a"
127.0.0.1:6380[1]> lpush list f #在左侧插入
127.0.0.1:6380[1]> lrange list 0 -1 => "f" "c" "b" "a"
127.0.0.1:6380[1]> lpush list b a
127.0.0.1:6380[1]> lrange list 0 -1 => "a" "b" "f" "c" "b" "a"
127.0.0.1:6380[1]> rpop list => "a"
127.0.0.1:6380[1]> lrange list 0 -1 => "a" "b" "f" "c" "b"
127.0.0.1:6380[1]> lpop list => "b" "f" "c" "b"
Set集合
127.0.0.1:6380[1]> sadd set1 a => 1
127.0.0.1:6380[1]> keys * => "set1" "emp:1" "list"
127.0.0.1:6380[1]> sadd set1 b => "b"
127.0.0.1:6380[1]> sadd set1 c => "c"
127.0.0.1:6380[1]> sadd set1 d => "d"
127.0.0.1:6380[1]> sadd set1 e => "e"
127.0.0.1:6380[1]> sadd set1 f => "f"
127.0.0.1:6380[1]> smembers set1 => "a" "b" "c" "d" "e" "f" "e" #字母顺序打乱 乱序
127.0.0.1:6380[1]> sadd set2 d #创建一个set2与set1有重叠
127.0.0.1:6380[1]> sadd set2 e
127.0.0.1:6380[1]> sadd set2 f
127.0.0.1:6380[1]> sadd set2 h
127.0.0.1:6380[1]> sadd set2 g
127.0.0.1:6380[1]> smembers set2 => "d" "h" "e" "f" "g"
127.0.0.1:6380[1]> sinter set1 set2 => "d" "f" "e" #取其中的交集
127.0.0.1:6380[1]> sunion set1 set2 => "d" "g" "b" "c" "h" "f" "e" "a" #取其中的并集[取并集并去除重复元素]
127.0.0.1:6380[1]> sdiff set1 set2 #寻找叉集(在set1有 在set2中没有[两个部分交集排除在外])
=> "a" "c" "b"
127.0.0.1:6380[1]> sdiff set2 set1 => "h" "g"
Zset集合
127.0.0.1:6380[1]> zadd zset1 100 a =>1
127.0.0.1:6380[1]> zadd zset1 101 b => 1
127.0.0.1:6380[1]> zrange zset1 0 -1 => "a" "b" #按照顺序排序
127.0.0.1:6380[1]> zadd zset1 99 c => 1
127.0.0.1:6380[1]> zrange zset1 0 -1 => "c" "a" "b" #按照分数升序排列
127.0.0.1:6380[1]> zadd zset1 102 d
127.0.0.1:6380[1]> zadd zset1 103 e
127.0.0.1:6380[1]> zadd zset1 104 f
127.0.0.1:6380[1]> zrange zset1 0 -1 withscores #升序打印分数
127.0.0.1:6380[1]> zrangebyscore zset1 100 103 #符合score从100-103的名字
Java客户端-Jedis
- Jedis是Java语言开发的Redis客户端工具包
- Jedis只是对Redis命令的封装, 掌握Redis命令便可轻易上手
允许远程访问需要改文件
[root@imooc ~]# cd /usr/local/redis/redis-5.0.2/
[root@imooc redis-5.0.2]# vim redis.conf
第88行 protected-mode yes 将yes设置为no
第69行 bind 127.0.0.1 改为 bind 0.0.0.0 #四个0代表所有ip主机都可以访问进来【真正开发时要用特定的ip号】
[root@imooc redis-5.0.2]# ./src/redis-server redis.conf
[root@imooc redis-5.0.2]# netstat -tulpn | grep redis
[root@imooc redis-5.0.2]# firewall-cmd --zone=public --add-port=6379/tcp --permanent
[root@imooc redis-5.0.2]# firewall-cmd --reload
[root@imooc redis-5.0.2]# ifconfig => IP地址: 192.168.170.135
[root@imooc redis-5.0.2]# ./src/redis-cli -p 6379
报错连接超时:
Java远程连接Redis时出现: java.net.SocketTimeoutException: connect timed out的解决办法-CSDN博客
Java连接Redis connection timed out 报错的解决方法_caused by: io.netty.channel.abstractchannel$annota-CSDN博客
systemctl start firewalld #开启防火墙
systemctl enable firewalld.service #开机自启动防火墙
systemctl stop firewalld.service #关闭防火墙
重启 Redis 服务端
ps -ef|grep redis #查看 Redis 进程
kill -s 9 进程号 #杀死 Redis 进程
[root@imooc redis-5.0.2]# ./src/redis-server redis.conf
package com.imooc.jedis;
import redis.clients.jedis.Jedis;
import java.util.List;
public class JedisTestor {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.170.135", 6379);
try {
jedis.auth("root");
jedis.select(2);
System.out.println("Redis连接成功");
//字符串
jedis.set("sn", "7781-9938");
String sn = jedis.get("sn");
System.out.println(sn);
jedis.mset(new String[]{"title", "婴幼儿奶粉", "num", "20"});
List<String> goods = jedis.mget(new String[]{"sn", "title", "num"});
System.out.println(goods);
Long num = jedis.incr("num");
System.out.println(num);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
jedis.close();
}
}
}
pom.xml【两个jar: jedis-2.9.0.jar fastjson-1.2.62.jar】
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Jedis_test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
[root@imooc redis-5.0.2]# ./src/redis-cli
127.0.0.1:6379> auth root
127.0.0.1:6379> select 2
127.0.0.1:6379[2]> keys * => "sn"
127.0.0.1:6379[2]> get sn => "7781-9938"
【此处更换新的java代码再次插入 奶粉...】
------------------------------------------------------------------
jedis.mset(new String[]{"title", "婴幼儿奶粉", "num", "20"});
List<String> goods = jedis.mget(new String[]{"sn", "title", "num"});
------------------------------------------------------------------
127.0.0.1:6379[2]> keys * => "sn" "num" "title"
127.0.0.1:6379[2]> get num => 21
127.0.0.1:6379[2]> get title => \xe5\xa9\xb4\xe5\xb9\xbc\xe5...
Jedis操作Hash类型
package com.imooc.jedis;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JedisTestor {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.170.135", 6379);
try {
jedis.auth("root");
jedis.select(2);
System.out.println("Redis连接成功");
//字符串
jedis.set("sn", "7781-9938");
String sn = jedis.get("sn");
System.out.println(sn);
jedis.mset(new String[]{"title", "婴幼儿奶粉", "num", "20"});
List<String> goods = jedis.mget(new String[]{"sn", "title", "num"});
System.out.println(goods);
Long num = jedis.incr("num");
System.out.println(num);
//Hash
jedis.hset("student:3312", "name", "张晓明");
String name = jedis.hget("student:3312", "name");
System.out.println(name);
Map<String,String> studentMap = new HashMap();
studentMap.put("name", "李兰");
studentMap.put("age", "18"); //所有数据类型都是String
studentMap.put("id", "3313");
jedis.hmset("student:3313", studentMap);
Map<String,String> smap = jedis.hgetAll("student:3313");
System.out.println(smap);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
jedis.close();
}
}
}
---------------------------------------------------------------
Redis连接成功
7781-9938
[7781-9938, 婴幼儿奶粉, 20]
21
张晓明
{name=李兰, age=18, id=3313}
127.0.0.1:6380[2]> hgetall student:3313
Jedis操作List类型
package com.imooc.jedis;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JedisTestor {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.170.135", 6379);
try { //List
jedis.del("letter"); //要先删除不然lpop、rpop的时候会追加数据
jedis.rpush("letter", new String[]{"d", "e", "f"});
jedis.lpush("letter", new String[]{"c", "b", "a"});
List<String> letter = jedis.lrange("letter", 0, -1);
jedis.lpop("letter");
jedis.rpop("letter");
letter = jedis.lrange("letter", 0, -1);
System.out.println(letter);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
jedis.close();
}
}
}
----————--——----------------------------------------------------
[a, b, c, d, e, f] => [b, c, d, e]
利用Jedis缓存数据 [放在内存处理 速度快]
缓存数据:资料不要太大 信息比较稳定更新次数较低
Goods.java
public class Goods {
private Integer goodsId;
private String goodsName;
private String description;
private Float price;
Getter + Setter + Constructor[空+全]
}
CacheSample.java
package com.imooc.jedis;
import com.alibaba.fastjson.JSON;
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
import java.util.List;
public class CacheSample {
public CacheSample(){ //数据初始化
Jedis jedis = new Jedis("192.168.170.135", 6379);
try {
List<Goods> goodsList = new ArrayList();
goodsList.add(new Goods(8818,"红富士苹果","",3.5f));
goodsList.add(new Goods(8819,"赣南脐橙","",5f));
goodsList.add(new Goods(8820,"进口香蕉","",2f));
//javabean序列化为json字符串保存到java里
jedis.auth("root");
jedis.select(3);
for (Goods goods : goodsList){
String json = JSON.toJSONString(goods);
System.out.println(json);
String key = "goods:" + goods.getGoodsId();
jedis.set(key, json); //key + value[序列化为json]
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
jedis.close();
}
}
public static void main(String[] args) {
new CacheSample();
}
}
________________________________________________________________
{"description":"","goodsId":8818,"goodsName":"红富士苹果","price":3.5}
{"description":"","goodsId":8819,"goodsName":"赣南脐橙","price":5.0}
{"description":"","goodsId":8820,"goodsName":"进口香蕉","price":2.0}
________________________________________________________________
127.0.0.1:6379[3]> keys *
127.0.0.1:6379[3]> "goods:8820" "goods:8819" "goods:8818"
127.0.0.1:6379[3]> get goods:8820
更新
CacheSample.java
package com.imooc.jedis;
import com.alibaba.fastjson.JSON;
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CacheSample {
public CacheSample(){ //数据初始化
Jedis jedis = new Jedis("192.168.170.135", 6379);
try {
List<Goods> goodsList = new ArrayList();
goodsList.add(new Goods(8818,"红富士苹果","",3.5f));
goodsList.add(new Goods(8819,"赣南脐橙","",5f));
goodsList.add(new Goods(8820,"进口香蕉","",2f));
//javabean序列化为json字符串保存到java里
jedis.auth("root");
jedis.select(3);
for (Goods goods : goodsList){
String json = JSON.toJSONString(goods);
System.out.println(json);
String key = "goods:" + goods.getGoodsId();
jedis.set(key, json); //key + value[序列化为json]
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
jedis.close();
}
}
public static void main(String[] args) {
new CacheSample();
System.out.println("请输入要查询的商品编号:");
String goodsId = new Scanner(System.in).next();
Jedis jedis = new Jedis("192.168.170.135");
jedis.auth("root");
jedis.select(3);
String key = "goods:" + goodsId;
if (jedis.exists(key)){
String json = jedis.get(key);
System.out.println(json);
//由json转回到java对象
Goods g = JSON.parseObject(json, Goods.class);
System.out.println(g.getGoodsName());
System.out.println(g.getPrice());
}else{
System.out.println("您输入的商品编号不存在,请重新输入!");
}
}
}